import { started } from "../start";
import { getAppChanges} from '../applications/app'
import {toLoadPromise} from '../lifecycles/load';
import {toUnmountPromise} from '../lifecycles/unmount';
import { toBootstrapPromise} from '../lifecycles/bootstrap'
import { toMountPromise} from '../lifecycles/mount'

import './navigation-events'

export function reroute() {
    // 需要获取要加载的应用（NOT_LOADED）
    // 需要获取要被挂载的应用（NOT_MOUNTED）
    // 哪些应用需要被卸载（MOUNTED）
    const {
        appsToLoad, // 获取要去加载的app（NOT_LOADED）
        appsToMount, // 获取要被挂载的（NOT_MOUNTED）
        appsToUnmount // 获取要被卸载的 （MOUNTED）
    } = getAppChanges();
    // console.log(appsToLoad,appsToMount,appsToUnmount);

    if(started){
        // app装载
        return performAppChanges(); //根据路径来装载应用
    }else{
        // 注册应用时，需要预先加载
        return loadApps() //预加载应用
    } 

    async function loadApps(){ // 预加载应用
        debugger
        let apps = await Promise.all(appsToLoad.map(toLoadPromise)) //获取到bootstrap，mount，unmount放到app上
        console.log(apps)
    }

    async function performAppChanges(){ // 启动逻辑，根据路径来装载应用
        // 1.先卸载不需要的应用，
        let unmountPromises =  appsToUnmount.map(toUnmountPromise) //需要卸载的app
        //将需要加载的应用拿到=》加载=》启动=》挂载
        // 这个应用可能需要加载，但是路径不匹配，例如加载app1的时候，这个时候切换到app2，就不需要加载app1了
        const loadThenMountPromises =  appsToLoad.map(async(app)=>{ 
            app = await toLoadPromise(app);  //加载
            app = await toBootstrapPromise(app); //启动
            return toMountPromise(app); //挂载
        })
        // 如果已经加载过了的应用 (启动 => 挂载)
        const mountPromises = appsToMount.map(async (app) => {
            app = await toBootstrapPromise(app);
            return toMountPromise(app);
        });

    }
}
